// Kony


#include "UI/HUD/BaseHUD.h"

#include "Blueprint/UserWidget.h"
#include "UI/Widget/BaseUserWidget.h"
#include "UI/WidgetController/AttributeMenuWidgetController.h"
#include "UI/WidgetController/OverlayWidgetController.h"
#include "UI/WidgetController/SpellMenuWidgetController.h"


UOverlayWidgetController* ABaseHUD::GetOverlayWidgetController(const FWidgetControllerParams& WCParams)
{
	if (OverlayWidgetController == nullptr)
	{
		//成员变量  创建一个覆盖层用户控件实例
		OverlayWidgetController = NewObject<UOverlayWidgetController>(this,OverlayWidgetControllerClass);
		//设置控件参数
		OverlayWidgetController->SetWidgetControllerParams(WCParams);
		//绑定小控件控制器数值变动回调函数 用于数据更变广播
		OverlayWidgetController->BindCallbacksToDependencies();
	}
	return OverlayWidgetController;
}
//获取属性菜单控制器
UAttributeMenuWidgetController* ABaseHUD::GetAttributeMenuWidgetController(const FWidgetControllerParams& WCParams)
{
	if (AttributeMenuWidgetController == nullptr)
	{
		//成员变量  创建一个覆盖层用户控件实例
		AttributeMenuWidgetController = NewObject<UAttributeMenuWidgetController>(this,AttributeMenuWidgetControllerClass);
		//设置控件参数
		AttributeMenuWidgetController->SetWidgetControllerParams(WCParams);
		//绑定小控件控制器数值变动回调函数 用于数据更变广播
		AttributeMenuWidgetController->BindCallbacksToDependencies();
	}
	return AttributeMenuWidgetController;
}
//获取法术菜单控制器
USpellMenuWidgetController* ABaseHUD::GetSpellMenuWidgetController(const FWidgetControllerParams& WCParams)
{
	if (SpellMenuWidgetController == nullptr)
	{
		//成员变量  创建一个覆盖层用户控件实例
		SpellMenuWidgetController = NewObject<USpellMenuWidgetController>(this,SpellMenuWidgetControllerClass);
		//设置控件参数
		SpellMenuWidgetController->SetWidgetControllerParams(WCParams);
		//绑定小控件控制器数值变动回调函数 用于数据更变广播
		SpellMenuWidgetController->BindCallbacksToDependencies();
	}
	return SpellMenuWidgetController;
}

//这里是初始化覆盖层（用户主界面UI）
void ABaseHUD::InitOverlay(APlayerController* PC, APlayerState* PS, UAbilitySystemComponent* ASC, UAttributeSet* AS)
{
	checkf(OverlayWidgetClass, TEXT("Overlay widget class uninitialized,please fill out BP_OverlayWidgetClass in BP_BaseHUD"))
	checkf(OverlayWidgetControllerClass, TEXT("Overlay widget controller class uninitialized,please fill out BP_OverlayWidgetControllerClass in BP_BaseHUD"))
	//这两行从BeginPlay改到InitOverlay中 教学说更合适
	// 使用OverlayWidgetClass创建一个覆盖层用户控件实例 用于添加主界面UI
	UUserWidget* Widget = CreateWidget<UUserWidget>(GetWorld(), OverlayWidgetClass);
	OverlayWidget = Cast<UBaseUserWidget>(Widget);
	//把用户的各种控制器、状态、技能、属性集传递给覆盖层用户控件
	const FWidgetControllerParams WidgetControllerParams(PC, PS, ASC, AS);
	//设置控件参数
	UOverlayWidgetController* WidgetController = GetOverlayWidgetController(WidgetControllerParams);
	OverlayWidget->SetWidgetController(WidgetController);
	//绑定广播初始化值 用于广播用户属性数据
	WidgetController->BroadcastInitializeValues();
	// 将控件添加到游戏视口中使其可见 最后才执行
	Widget->AddToViewport();

	
}


